Goal: decide number of pops, maternal families, etc. Then planting design. Parameters: maximize number of pops, then number of maternal families. Plant 2000.
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ───────────────────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.3.6 ✔ purrr 0.3.4
✔ tibble 3.1.8 ✔ dplyr 1.0.10
✔ tidyr 1.2.0 ✔ stringr 1.4.1
✔ readr 2.1.2 ✔ forcats 0.5.2 ── Conflicts ──────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
library(googlesheets4)
library(ggforce)
is.even <- function(x) x%%2 == 0
pops <- read_sheet("https://docs.google.com/spreadsheets/d/1dif9Y5hbkSa56Bgonj04-jXh8jNc6f13RBS6BPUf1IQ",
skip=1,
na=c("NA", ""),
col_types = c("ciiiccccc"),
.name_repair = "universal") %>%
mutate(approx.number.seeds = as.integer(str_remove_all(approx.number.seeds,"[^0-9]")))
✔ Reading from Int Bio parents seed stock.
✔ Range 2:10000000.
New names:
pops
pops.filtered <- pops %>% group_by(parent.pop) %>% slice_max(order_by=maternal.families) %>%
filter(approx.number.seeds >= 100) %>%
filter(!(parent.pop %in% c("HH", "RB"))) # old seed
pops.filtered %>% arrange(maternal.families)
sum(pops.filtered$maternal.families>=8)
[1] 21
sum(pops.filtered$maternal.families>=15)
[1] 18
Plant 21 pops * 8 families * 12 reps (= 2016 plants)
Plant 11 pops * 15 families * 12 reps (= 1980 plants)
__Note: after calculating above, Sarah found more mfs from WV, so:_
3 mfs from WR and 7 mfs from everyone else
total mfs = 3+722 = 157 13 reps (= 2041 plants)
2041 plants. 1 block per rep, so 13 blocks each of 157 plants
157/4 = 39.25 with 4 columns this is 39.25 plants per column per block. Call it 40
Create grid
blocks <- 13
columns <- 4
rows <- 40
plants <- blocks * columns * rows
size <- 20 # plant diameter
radius <- size/2
aisle <- 90
plan3 <- expand_grid(block=LETTERS[1:blocks],
column=1:columns,
row=1:rows,
radius=radius)
plan3
add positions
column_offset <- sqrt((2*radius)^2 - radius^2) # Pythagorean theorem for offset spacing
plan3 <- plan3 %>%
mutate(y_pos=ifelse(is.even(column),
row*size,
row*size-radius),
x_pos=ifelse(column==1,
radius,
radius+(column-1)*column_offset))
plan3
Plot it
# only offset x_positions (1 "row" of blocks)
plan3 <- plan3 %>%
mutate(block_x_offset = as.integer(as.factor(block))-1,
block_x_offset = block_x_offset* (aisle + size + (columns-1)*column_offset))
#create block labels
block.labels <- plan3 %>%
group_by(block) %>%
summarize(x_pos = mean(x_pos+block_x_offset), y_pos=max(y_pos*1.075))
plan3 %>% #filter(block=="A", row <6) %>%
ggplot(aes(x0=x_pos+block_x_offset, y0=y_pos, r=radius)) +
geom_circle(fill="lightgreen", alpha=.25) +
coord_equal() +
geom_text(aes(x=x_pos, y=y_pos, label=block), size= 20, data = block.labels, inherit.aes = FALSE) +
theme(axis.text = element_text(size=16), axis.title = element_text(size=16)) +
xlab("position (cm)") + ylab("position (cm)")
Alternate, what if we stack blocks
# only offset x_positions (1 "row" of blocks)
plan3 <- plan3 %>%
mutate(block_x_offset = as.integer(as.factor(block)) %% 7 -1,
block_x_offset = block_x_offset* (aisle + size + (columns-1)*column_offset)) %>%
mutate(block_y_offset = (as.integer(as.factor(block)) %/% 7)*-1+1 ,
block_y_offset = block_y_offset*size*rows+block_y_offset*aisle*1.5)
#create block labels
block.labels <- plan3 %>%
group_by(block) %>%
summarize(x_pos = mean(x_pos+block_x_offset), y_pos=max(block_y_offset + y_pos*1.075))
plan3 %>% #filter(block=="A", row <6) %>%
ggplot(aes(x0=x_pos+block_x_offset, y0=y_pos+block_y_offset, r=radius)) +
geom_circle(fill="lightgreen", alpha=.25) +
coord_equal() +
geom_text(aes(x=x_pos, y=y_pos, label=block), size= 20, data = block.labels, inherit.aes = FALSE) +
theme(axis.text = element_text(size=16), axis.title = element_text(size=16)) +
xlab("position (cm)") + ylab("position (cm)")